# -*- coding: utf-8 -*-

# Create your views here.
from datetime import date

from django.template import RequestContext
from django.shortcuts import render_to_response
from django.http import HttpResponseRedirect
from django.db.models import Q

from ..models import (
    BancoPesos,
    BancoDolares,
)
from ..forms import (
    SelectorMesAnio,
    BancoPesosForm,
    BancoDolaresForm,
)


# CUENTAS DE BANCO

def actualizar_saldo_banco(cuenta):
    """Recibe como parametro 'cuenta' una lista con todos los objetos del model
    bancoDolares, o sea, bancoDolares.objects.all()"""
    i = -1
    for registro in cuenta.order_by('fechaAcreditacion', 'id'):
        i += 1  # Arranca en 0
        if i > 0:
            prev = cuenta[i - 1]  # objeto previo en cuenta
        else:
            prev = None
        if registro.fechaAcreditacion <= date.today():
            try:
                if prev:
                    if registro.debe > 0:
                        registro.saldo = prev.saldo - registro.debe
                        registro.save()
                    if registro.haber > 0:
                        registro.saldo = prev.saldo + registro.haber
                        registro.save()
                else:
                    if registro.debe > 0:
                        registro.saldo = registro.debe * (-1)
                        registro.save()
                    if registro.haber > 0:
                        registro.saldo = registro.haber
                        registro.save()
            except:
                pass
        else:
            if prev:
                registro.saldo = prev.saldo
                registro.save()
            else:
                registro.saldo = 0
                registro.save()


def calculo_saldo_mes_anterior_bp(mes, anio):
    """Calcula el saldo del mes anterior
    Banco pesos
    """
    saldo_mes_anterior = []
    saldo_anterior = None
    mes_anterior = mes
    anio_anterior = anio
    while len(saldo_mes_anterior) == 0:
        if mes_anterior == '1':
            mes_anterior = '12'
            anio_anterior = str(int(anio_anterior) - 1)
        else:
            mes_anterior = str(int(mes_anterior) - 1)
        if anio_anterior == '1970':
            saldo_anterior = 0
            break
        else:
            saldo_mes_anterior = BancoPesos.objects.filter(fechaAcreditacion__month=mes_anterior,
                                                           fechaAcreditacion__year=anio_anterior).order_by(
                '-fechaAcreditacion', '-id')
    if saldo_anterior != 0:
        if len(saldo_mes_anterior) > 0:
            saldo_anterior = saldo_mes_anterior[0].saldo
        else:
            saldo_anterior = 0
    return saldo_anterior


def calculo_saldo_mes_anterior_bd(mes, anio):
    """Calcula el saldo del mes anterior
    Banco dolares
    """
    saldo_mes_anterior = []
    saldo_anterior = None
    mes_anterior = mes
    anio_anterior = anio
    while len(saldo_mes_anterior) == 0:
        if mes_anterior == '1':
            mes_anterior = '12'
            anio_anterior = str(int(anio_anterior) - 1)
        else:
            mes_anterior = str(int(mes_anterior) - 1)
        if anio_anterior == '1970':
            saldo_anterior = 0
            break
        else:
            saldo_mes_anterior = BancoDolares.objects.filter(fechaAcreditacion__month=mes_anterior,
                                                             fechaAcreditacion__year=anio_anterior).order_by(
                '-fechaAcreditacion', '-id')
    if saldo_anterior != 0:
        if len(saldo_mes_anterior) > 0:
            saldo_anterior = saldo_mes_anterior[0].saldo
        else:
            saldo_anterior = 0
    return saldo_anterior


def listado_banco_pesos(request, formid):
    """Listado de cuenta en pesos"""
    if request.user.is_authenticated():
        if request.method == 'POST':
            # Form de ingreso de nuevo gasto
            if formid == '1':
                form = BancoPesosForm(request.POST)
                form2 = SelectorMesAnio()
                if form.is_valid():
                    registro = form.save()
                    if not registro.fechaAcreditacion:
                        registro.fechaAcreditacion = registro.fecha
                    registro.save()
                    ultimo_registro_anterior = \
                        BancoPesos.objects.filter(fechaAcreditacion__lt=registro.fechaAcreditacion).order_by(
                            '-fechaAcreditacion', '-id')[0]
                    todos = BancoPesos.objects.filter(fechaAcreditacion__gte=ultimo_registro_anterior.fechaAcreditacion)
                    actualizar_saldo_banco(todos)
                    return HttpResponseRedirect('/banco/pesos/listado/0/')
            # Form de seleccion de mes y año
            if formid == '2':
                form = BancoPesosForm()
                form2 = SelectorMesAnio(request.POST)
                if form2.is_valid():
                    mes = form2.cleaned_data['mes']
                    anio = form2.cleaned_data['anio']
                    saldo_anterior = calculo_saldo_mes_anterior_bp(mes, anio)
                    todo_actualizado = BancoPesos.objects.filter(Q(fechaAcreditacion__month=mes) &
                                                                 Q(fechaAcreditacion__year=anio) |
                                                                 Q(fecha__month=mes) &
                                                                 Q(fecha__year=anio))
                    variables = RequestContext(request, {
                        'form': form,
                        'form2': form2,
                        'mes': mes,
                        'anio': anio,
                        'todo': todo_actualizado,
                        'saldo_anterior': saldo_anterior,
                    })
                    return render_to_response('listado_bancoPesos.html', variables)
                else:
                    return HttpResponseRedirect('/banco/pesos/listado/0/')
        # GET
        else:
            form = BancoPesosForm()
            form2 = SelectorMesAnio()

            # Si clickea en Ver Todos
            if formid == '3':
                mes = 0
                todos = BancoPesos.objects.all()
                variables = RequestContext(request, {
                    'form': form,
                    'form2': form2,
                    'mes': mes,
                    'todo': todos,
                })
                return render_to_response('listado_bancoPesos.html', variables)
            # Muestra Mes actual
            else:
                fecha_hoy = date.today()
                fecha = date(fecha_hoy.year - 1, 12, 31)
                ultimo_registro_anterior = \
                    BancoPesos.objects.filter(fechaAcreditacion__lt=fecha).order_by('-fechaAcreditacion', '-id')[0]
                todos = BancoPesos.objects.filter(fechaAcreditacion__gte=ultimo_registro_anterior.fechaAcreditacion)
                actualizar_saldo_banco(todos)
                mes = str(date.today().month)
                anio = str(date.today().year)
                saldo_anterior = calculo_saldo_mes_anterior_bp(mes, anio)
                todo_actualizado = BancoPesos.objects.filter(Q(fechaAcreditacion__month=mes) &
                                                             Q(fechaAcreditacion__year=anio) |
                                                             Q(fecha__month=mes) &
                                                             Q(fecha__year=anio))
                variables = RequestContext(request, {
                    'form': form,
                    'form2': form2,
                    'mes': mes,
                    'anio': anio,
                    'todo': todo_actualizado,
                    'saldo_anterior': saldo_anterior,
                })
                return render_to_response('listado_bancoPesos.html', variables)
    else:
        return HttpResponseRedirect('/login/?next=%s' % request.path)


def editar_banco_pesos(request, bpid):
    """Edita Banco pesos"""
    if request.user.is_authenticated():
        r = BancoPesos.objects.get(pk=bpid)
        if request.method == 'POST':
            form = BancoPesosForm(request.POST, instance=r)
            if form.is_valid():
                registro = form.save()
                if not registro.fechaAcreditacion:
                    registro.fechaAcreditacion = registro.fecha
                registro.save()
                ultimo_registro_anterior = \
                    BancoPesos.objects.filter(fechaAcreditacion__lt=registro.fechaAcreditacion).order_by(
                        '-fechaAcreditacion', '-id')[0]
                todos = BancoPesos.objects.filter(fechaAcreditacion__gte=ultimo_registro_anterior.fechaAcreditacion)
                actualizar_saldo_banco(todos)
                return HttpResponseRedirect('/banco/pesos/listado/0/')
        else:
            form = BancoPesosForm(instance=r)
        variables = RequestContext(request, {'form': form})
        return render_to_response('editar_bancoPesos.html', variables)
    else:
        return HttpResponseRedirect('/login/?next=%s' % request.path)


def check_banco_pesos(request, bpid):
    """Confirmar antes de eliminar"""
    if request.user.is_authenticated():
        bp = BancoPesos.objects.get(pk=bpid)
        variables = RequestContext(request, {'bp': bp})
        return render_to_response('borrado_bancoPesos.html', variables)
    else:
        return HttpResponseRedirect('/login/?next=%s' % request.path)


def borrar_banco_pesos(request, bpid):
    """Elimina Banco pesos"""
    if request.user.is_authenticated():
        r = BancoPesos.objects.get(pk=bpid)
        r.delete()
        ultimo_registro_anterior = \
            BancoPesos.objects.filter(fechaAcreditacion__lt=r.fechaAcreditacion).order_by('-fechaAcreditacion', '-id')[
                0]
        todos = BancoPesos.objects.filter(fechaAcreditacion__gte=ultimo_registro_anterior.fechaAcreditacion)
        actualizar_saldo_banco(todos)
        return HttpResponseRedirect('/banco/pesos/listado/0/')
    else:
        return HttpResponseRedirect('/login/?next=%s' % request.path)


def listado_banco_dolares(request, formid):
    """Listado de cuenta en dolares"""
    if request.user.is_authenticated():
        if request.method == 'POST':
            # Form de ingreso de nuevo gasto
            if formid == '1':
                form = BancoDolaresForm(request.POST)
                form2 = SelectorMesAnio()
                if form.is_valid():
                    registro = form.save()
                    if not registro.fechaAcreditacion:
                        registro.fechaAcreditacion = registro.fecha
                    registro.save()
                    ultimo_registro_anterior = \
                        BancoDolares.objects.filter(fechaAcreditacion__lt=registro.fechaAcreditacion).order_by(
                            '-fechaAcreditacion', '-id')[0]
                    todos = BancoDolares.objects.filter(
                        fechaAcreditacion__gte=ultimo_registro_anterior.fechaAcreditacion)
                    actualizar_saldo_banco(todos)
                    return HttpResponseRedirect('/banco/dolares/listado/0/')
            # Form de seleccion de mes y año
            if formid == '2':
                form = BancoDolaresForm()
                form2 = SelectorMesAnio(request.POST)
                if form2.is_valid():
                    mes = form2.cleaned_data['mes']
                    anio = form2.cleaned_data['anio']
                    saldo_anterior = calculo_saldo_mes_anterior_bd(mes, anio)
                    todo_actualizado = BancoDolares.objects.filter(Q(fechaAcreditacion__month=mes) &
                                                                   Q(fechaAcreditacion__year=anio) |
                                                                   Q(fecha__month=mes) &
                                                                   Q(fecha__year=anio))
                    variables = RequestContext(request, {
                        'form': form,
                        'form2': form2,
                        'mes': mes,
                        'anio': anio,
                        'todo': todo_actualizado,
                        'saldo_anterior': saldo_anterior,
                    })
                    return render_to_response('listado_bancoDolares.html', variables)
                else:
                    return HttpResponseRedirect('/banco/dolares/listado/0/')
        # GET
        else:
            form = BancoDolaresForm()
            form2 = SelectorMesAnio()

            # Si clickea en Ver Todos
            if formid == '3':
                mes = 0
                todos = BancoDolares.objects.all()
                variables = RequestContext(request, {
                    'form': form,
                    'form2': form2,
                    'mes': mes,
                    'todo': todos,
                })
                return render_to_response('listado_bancoDolares.html', variables)
            # Muestra Mes actual
            else:
                fecha_hoy = date.today()
                fecha = date(fecha_hoy.year - 1, 12, 31)
                ultimo_registro_anterior = \
                    BancoDolares.objects.filter(fechaAcreditacion__lt=fecha).order_by('-fechaAcreditacion', '-id')[0]
                todos = BancoDolares.objects.filter(fechaAcreditacion__gte=ultimo_registro_anterior.fechaAcreditacion)
                actualizar_saldo_banco(todos)
                mes = str(date.today().month)
                anio = str(date.today().year)
                saldo_anterior = calculo_saldo_mes_anterior_bd(mes, anio)
                todo_actualizado = BancoDolares.objects.filter(Q(fechaAcreditacion__month=mes) &
                                                               Q(fechaAcreditacion__year=anio) |
                                                               Q(fecha__month=mes) &
                                                               Q(fecha__year=anio))
                variables = RequestContext(request, {
                    'form': form,
                    'form2': form2,
                    'mes': mes,
                    'anio': anio,
                    'todo': todo_actualizado,
                    'saldo_anterior': saldo_anterior,
                })
                return render_to_response('listado_bancoDolares.html', variables)
    else:
        return HttpResponseRedirect('/login/?next=%s' % request.path)


def editar_banco_dolares(request, bpid):
    """Edita Banco dolares"""
    if request.user.is_authenticated():
        r = BancoDolares.objects.get(pk=bpid)
        if request.method == 'POST':
            form = BancoDolaresForm(request.POST, instance=r)
            if form.is_valid():
                registro = form.save()
                if not registro.fechaAcreditacion:
                    registro.fechaAcreditacion = registro.fecha
                registro.save()
                ultimo_registro_anterior = \
                    BancoDolares.objects.filter(fechaAcreditacion__lt=registro.fechaAcreditacion).order_by(
                        '-fechaAcreditacion', '-id')[0]
                todos = BancoDolares.objects.filter(fechaAcreditacion__gte=ultimo_registro_anterior.fechaAcreditacion)
                actualizar_saldo_banco(todos)
                return HttpResponseRedirect('/banco/dolares/listado/0/')
        else:
            form = BancoDolaresForm(instance=r)
        variables = RequestContext(request, {'form': form})
        return render_to_response('editar_bancoDolares.html', variables)
    else:
        return HttpResponseRedirect('/login/?next=%s' % request.path)


def check_banco_dolares(request, bpid):
    """Confirmar antes de eliminar"""
    if request.user.is_authenticated():
        bp = BancoDolares.objects.get(pk=bpid)
        variables = RequestContext(request, {'bp': bp})
        return render_to_response('borrado_bancoDolares.html', variables)
    else:
        return HttpResponseRedirect('/login/?next=%s' % request.path)


def borrar_banco_dolares(request, bpid):
    """Elimina Banco dolares"""
    if request.user.is_authenticated():
        r = BancoDolares.objects.get(pk=bpid)
        r.delete()
        ultimo_registro_anterior = \
            BancoDolares.objects.filter(fechaAcreditacion__lt=r.fechaAcreditacion).order_by('-fechaAcreditacion',
                                                                                            '-id')[0]
        todos = BancoDolares.objects.filter(fechaAcreditacion__gte=ultimo_registro_anterior.fechaAcreditacion)
        actualizar_saldo_banco(todos)
        return HttpResponseRedirect('/banco/dolares/listado/0/')
    else:
        return HttpResponseRedirect('/login/?next=%s' % request.path)

